IDA动态调试Android So文件
前言
参考了网上的教程自己动手调试so文件,在过程中发现了一些问题,并且有部分步骤和网上的教程不太一样。
用到的工具和样本:
IDA 6.8
debugjniso.apk
libdebugjniso.so
实验的apk文件和so文件是从非虫的Android软件安全与逆向分析中动态调试一章中获得的样本。主要的功能是点击界面的按钮控件更改应用的标题,而这部分的功能是在so文件中实现的。
在捣鼓的过程中,主要分成了三种方法,具体步骤如下:
方法一
1.开启android_server
2.端口转发
3.以调试方式启动程序
打开ddms ,接着以调试方式启动程序
4.jdb connect
5.ida调试端口设置及挂接
假设出现下面的情况话,全部选cancel即可
Debugger-Attach-RemoteArmLinux/Android debugger,Hostname填localhost,port是android_server开启的端口
(注意, 不打开应用就无法挂接相应的process ,所以该步之前会有步骤3)
6.下断点和运行调试
要注意的是, 确保so文件已经被加载到内存中,否则会查找不到so文件的内存基地址
接着ctrl+s,找到内存地址
打开另外一个ida,加载so文件,找到要下断点函数对应的位置
可以得知,jniString()方法的偏移地址为C38,所以对应的内存地址为7689FC38,按G跳转到对应的地址
下断点
运行(F9),点击界面的控件,接着进行调试,F7单步步入,F8单步步出
方法二
1.打开ida加载so文件,在对应的函数处下断点。
2.开启android_server
3.端口转发
4.以调试方式启动程序
5.ida调试端口设置及挂接
6.jdb connect
7.点击运行(F9),点击手机的控件
点击“same”。直接就跳到断点处了。
方法三
假设不考虑反调试或加壳的情况,仅仅是简单地动态调试那么有个更加简便的方法。
- 启动android_server
- 端口转发
- ida加载so文件,并在相应的位置下断点
- 在手机打开应用,ida挂接,attach to process
- 运行(F9),点击手机控件,就跳到相应断点的地方了,接着可以开始调试。
总结
下面是调试过程中的一些总结和思考。
方法一二三的不同之处在于:
方法一和二是用adb以调试模式打开应用,而方法三是直接在手机打开应用,直接打开应用的一个不足之处在于,加壳通常都是在so文件运行之前做的工作,如果直接手机打开应用,那么就会错过分析加壳过程的时机,因此要用调试模式打开;
方法一比方法二多了一步寻址的工作,方法二中是先加载so文件下断点,这样就不需要像方法一那样进行断电寻址的工作了。
综上,假如是普通的动态调试so文件,那么方法三最简便,如果有反调试,那么采用方法二会比较简便。